import axios from 'axios';
import { Message, Loading } from 'element-ui';
import store from '@/store';
import { getToken } from '@/utils/auth';
import errorCode from '@/utils/errorCode';

// 创建一个独立的axios实例用于文件上传
const uploadService = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 使用统一baseURL
  timeout: 30000, // 延长超时时间至30秒
  headers: {
    'Content-Type': 'multipart/form-data' // 默认文件上传格式
  }
});

// 全局上传Loading实例
let uploadLoadingInstance;

// 请求拦截器（处理Token和参数转换）
uploadService.interceptors.request.use(config => {
  // 1. Token处理 (默认携带token，可通过headers: { isToken: false } 关闭)
  const isToken = (config.headers || {}).isToken === false;
  if (getToken() && !isToken) {
    config.headers['Authorization'] = 'Bearer ' + getToken();
  }

  // 2. 自动转换FormData格式
  if (config.data && config.isFormData !== false) { // 默认启用自动转换
    const formData = new FormData();
    Object.keys(config.data).forEach(key => {
      // 处理多文件数组上传 (当值为数组且元素为文件时逐个添加)
      console.log("config.data[key]:",config.data[key])
      if (Array.isArray(config.data[key]) && config.data[key][0] instanceof File) {
        config.data[key].forEach(file => {
          formData.append(key, file);
        });
      } else {
        formData.append(key, config.data[key]);
      }
    });
    config.data = formData;
  }

  // 3. 调试日志
  console.log(`[UPLOAD] ${config.method.toUpperCase()} ${config.url}`, config.data);

  return config;
}, error => {
  Message.error('请求配置错误');
  return Promise.reject(error);
});

// 响应拦截器（复用原有登录失效处理逻辑）
uploadService.interceptors.response.use(res => {
  const code = res.data.code || 200;
  const msg = errorCode[code] || res.data.msg || errorCode['default'];

  // 处理文件流（根据实际接口调整）
  if (res.headers['content-type'].indexOf('octet-stream') > -1) {
    return res.data;
  }

  if (code === 401) {
    handleUnauthorized();
    return Promise.reject('登录失效');
  } else if (code !== 200) {
    Message({ message: msg, type: 'error' });
    return Promise.reject(msg);
  }
  return res.data;
}, error => {
  handleResponseError(error);
  return Promise.reject(error);
});

/**
 * 通用文件上传方法（支持进度监控）
 * @param {string} url 上传地址
 * @param {Object} data 上传数据（自动转FormData）
 * @param {Object} config axios配置
 * @param {number} [minLoading=500] 最小loading显示时间(ms)
 */
export function upload(url, data, config = {}, minLoading = 500) {
  uploadLoadingInstance = Loading.service({
    text: '文件上传中...',
    spinner: 'el-icon-loading',
    background: 'rgba(0, 0, 0, 0.7)'
  });

  const startTime = Date.now();
  return uploadService.post(url, data, {
    onUploadProgress: progressEvent => {
      if (config.onProgress) {
        const percent = Math.floor((progressEvent.loaded / progressEvent.total) * 100);
        config.onProgress(percent); // 触发外部进度回调
      }
    },
    ...config
  }).finally(() => {
    // 确保至少显示loading minLoading毫秒（防止闪烁）
    const diff = Date.now() - startTime;
    setTimeout(() => uploadLoadingInstance.close(), Math.max(0, minLoading - diff));
  });
}

// 处理401未授权
function handleUnauthorized() {
  if (!store.getters.token) return;
  Message.error('登录失效，请重新登录');
  store.dispatch('LogOut').then(() => {
    location.href = '/login';
  });
}

// 统一处理响应错误
function handleResponseError(error) {
  let { message } = error;
  if (message.includes('timeout')) {
    message = '文件上传超时';
  } else if (message.includes('Network Error')) {
    message = '网络连接异常';
  }
  Message.error(message || '上传失败');
}

export default uploadService;
